/**
 * Snake类     蛇类
 **/
function Snake(imgs) {
    // 数组属性 用于存储蛇的每一节身体
    this.arr = [
        { x: 4, y: 4 },
        { x: 4, y: 5 },
        { x: 4, y: 6 },
        { x: 4, y: 7 },
        { x: 4, y: 8 }
    ];

    // 方向属性
    this.direction = 39;  // 37 表示左箭头  38 上箭头  39 右箭头 40 下箭头
    // 定义锁
    this.lock = true;

    // 定义头部图片
    this.head_img = imgs.head_img;
    // 定义头部图片索引值
    this.head_idx = 2;
    // 定义身体部分图片
    this.body_img = imgs.body_img;
    // 定义尾部图片
    this.tail_img = imgs.tail_img;
    // 定义头部图片索引值
    this.tail_idx = 0;
}

// 定义蛇移动的方法
Snake.prototype.move = function() {
    // 当蛇移动起来之后就可以开锁了
    this.lock = true;

    // 1 根据老的头部创建新头部
    var newHead = {
        x: this.arr[this.arr.length - 1].x,
        y: this.arr[this.arr.length - 1].y
    }

    // 2 根据方向渲染新的头部
    // if (this.direction === 37) {
    //     // 此时行不变 列要--
    //     newHead.y--;
    // } else if ()
    
    // 使用swicth 语句
    switch (this.direction) {
        case 37: 
            // 此时行不变 列要--
            newHead.y--;
            break;
        case 38:
            // 此时行-- 列不变
            newHead.x--;
            break;
        case 39:
            // 此时行不变 列要++
            newHead.y++;
            break;
        case 40:
            // 此时行++ 列不变
            newHead.x++;
            break;
    }


    // 3 将新的头部追加到数组中
    this.arr.push(newHead);

    // 4 删除蛇的尾部 （数组的第一项）
    this.arr.shift();

    // 获取尾部
    var tail = this.arr[0];
    // 获取尾部的上一项
    var prev = this.arr[1];

    // 判断是在同一行还是同一列
    if (tail.x === prev.x) {
        // 比较列的关系
        // if (tail.y > prev.y) {
        //     // 改变索引值
        //     this.tail_idx = 2;
        // } else {
        //     this.tail_idx = 0;
        // }

        // 简写
        this.tail_idx = tail.y > prev.y ? 2 : 0;

    } else {
        // 说明在同一列
        // 要比较行的关系
        // if (tail.x > prev.x) {
        //     this.tail_idx = 1;
        // } else {
        //     this.tail_idx = 3;
        // }

        this.tail_idx = tail.x > prev.x ? 3 : 1;
    }

}


// 蛇转向的方法
Snake.prototype.change = function(direction) {
    // 判断锁的状态
    if (!this.lock) return;

    // 把锁关闭
    this.lock = false;
 
    // 拿着用户传递的方向属性 和 蛇自身的方向属性进行匹配
    var result = Math.abs(direction - this.direction);

    // 判断方向的合法性
    if (result === 0 || result === 2) return;

    // 如果是合法的就设置方向
    this.direction = direction;


    // 改变头部索引值
    if (direction === 37) {
        this.head_idx = 0;
    } else if (direction === 38) {
        this.head_idx = 1;
    } else if (direction === 39) {
        this.head_idx = 2;
    } else if (direction === 40) {
        this.head_idx = 3;
    }

}

// 蛇生长的方法
Snake.prototype.goUp = function() {
    // 获取蛇的尾部 (数组的第0项)
    var tail = this.arr[0];

    // 追加到数组的第一项
    this.arr.unshift(tail);
}